package com.example.apidocserver.interfaces.facade;

import com.example.apidocserver.application.event.DocumentEvent;
import com.example.apidocserver.domain.document.entity.ApiDocument;
import com.example.apidocserver.domain.document.entity.ApiInfo;
import com.example.apidocserver.domain.document.entity.DocMenu;
import com.example.apidocserver.infrastructure.aop.PermissionAnno;
import com.example.apidocserver.infrastructure.util.result.ResultData;
import com.example.apidocserver.infrastructure.util.result.ResultUtils;
import com.example.apidocserver.interfaces.assembler.DocumentAssembler;
import com.example.apidocserver.interfaces.vo.OrderChangeVo;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Optional;

import static com.example.apidocserver.interfaces.assembler.CommonAssembler.checkInt;

/**
 * 空间内管理接口
 *
 * @author xyqlg
 */
@RestController
@RequestMapping("document")
public class DocumentController {
    @Resource
    private DocumentEvent documentEvent;

    /**
     * 进入文档调用接口获取页面展示信息
     *
     * @param writeFlag   是否为编辑查询
     * @param pubOnlyFlag 只查询公开文档信息
     * @param spaceId     工作空间id，可为空
     * @return 文档展示对象
     */
    @GetMapping("getReadDocuments")
    public ResultData getReadDocuments(@RequestParam(name = "writeFlag", defaultValue = "false") Boolean writeFlag,
                                       @RequestParam(name = "pubOnlyFlag", defaultValue = "true") Boolean pubOnlyFlag,
                                       @RequestParam(name = "spaceId", required = false) Integer spaceId) {
        return ResultUtils.success(documentEvent.getReadDocuments(spaceId, writeFlag, pubOnlyFlag));
    }

    /**
     * 查询文档目录，查看目录
     *
     * @param docId     文档id
     * @param envId     环境id
     * @param writeFlag 是否为编辑查询
     * @return 文档目录
     */
    @GetMapping("getDocMenu/{docId}/{envId}")
    public ResultData getReadDocMenu(@RequestParam(name = "writeFlag", defaultValue = "false") Boolean writeFlag,
                                     @RequestParam(name = "pubOnlyFlag", defaultValue = "true") Boolean pubOnlyFlag,
                                     @PathVariable("docId") Integer docId, @PathVariable("envId") Integer envId) {
        checkInt(docId);
        return ResultUtils.success(documentEvent.getDocumentMenu(docId, envId, writeFlag, pubOnlyFlag));
    }

    /**
     * 增加文档
     *
     * @param document 文档信息
     * @return 是否增加成功
     */
    @PostMapping("addDoc")
    public ResultData addDoc(@RequestBody ApiDocument document) {
        DocumentAssembler.check(document);
        document.setId(null);
        return ResultUtils.success(documentEvent.addDoc(document));
    }

    /**
     * 增加或修改目录对象
     *
     * @param docMenu 目录数据对象
     * @return 新增目录信息
     */
    @PostMapping("upsertDocMenu")
    @PermissionAnno
    public ResultData upsertDocMenu(@RequestBody DocMenu docMenu) {
        Optional<ApiInfo> apiInfoOptional = DocumentAssembler.checkAddMenu(docMenu);
        ApiInfo apiInfo = null;
        if (apiInfoOptional.isPresent()) {
            apiInfo = apiInfoOptional.get();
        }
        return ResultUtils.success(documentEvent.upsertDocMenu(docMenu, apiInfo));
    }

    /**
     * 数据移动位置
     *
     * @param params 实体
     * @return 修改结果
     */
    @PostMapping("orderChangeMenu")
    @PermissionAnno
    public ResultData orderChange(@RequestBody OrderChangeVo params) {
        return ResultUtils.success(this.documentEvent.orderChangeMenu(params));
    }

    /**
     * 删除文档目录
     *
     * @param id 目录id
     * @return 删除数量
     */
    @DeleteMapping("menu/{id}")
    @PermissionAnno
    public ResultData deleteMenu(@PathVariable("id") Integer id) {
        checkInt(id);
        documentEvent.deleteMenu(id);
        return ResultUtils.success();
    }
}
